package cachex

import "gitee.com/zhongguo168a/gocodes/datax/mapx"

func (s *Object) RefRemove(field string) {
	s.mutex.Lock()
	s.refRemove(field)
	s.mutex.Unlock()
}

func (s *Object) refRemove(field string) {
	if s.data == nil {
		return
	}
	s.data[field] = nil
	delete(s.data, field)
}
func (s *Object) RefRemoveByMap(fieldMap map[string]interface{}) {
	s.mutex.Lock()
	s.refRemoveByMap(fieldMap)
	s.mutex.Unlock()
}

// 删除的逻辑与[mapx.Delete]一致
func (s *Object) refRemoveByMap(fieldMap map[string]interface{}) {
	if fieldMap == nil { // 表示不需要变化
		return
	}
	if s.data == nil { // 没有可删除的字段
		return
	}
	sdata := s.data
	for field, ifVal := range fieldMap {
		if ifVal == nil { // 值为nil的时候需要删除
			s.refRemove(field)
			continue
		}
		switch fVal := ifVal.(type) {
		case map[string]interface{}: // 如果是map, 表示不删除当前层, 只删除下一层
			if fVal == nil { // 值为nil的时候需要删除
				s.refRemove(field)
				continue
			}
			isval, has := sdata[field]
			if !has { // a的键值不存在，表示已经被删除，不需要处理
				continue
			}
			switch sval := isval.(type) {
			case IObject:
				if sval.RefIsNil() { // a的键值为nil，不需要遍历下一层
					continue
				}
				sval.refRemoveByMap(fVal)
			case map[string]interface{}:
				mapx.DeleteByKeyMap(sval, fVal, false)
			}

		default: // 否则, 删除当前
			s.refRemove(field)
			continue
		}

	}
}
